package com.demo.youxuanmall.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.demo.youxuanmall.common.Result;
import com.demo.youxuanmall.entity.Order;

import java.util.List;
import java.util.Map;

public interface OrderService extends IService<Order> {
    
    /**
     * 创建订单
     * @param userId 用户ID
     * @param shippingId 收货地址ID
     * @return 创建结果
     */
    Result<Order> createOrder(Long userId, Long shippingId);
    
    /**
     * 查询订单详情
     * @param userId 用户ID
     * @param orderNo 订单编号
     * @return 订单详情
     */
    Result<Order> getOrderDetail(Long userId, String orderNo);
    
    /**
     * 查询用户订单列表
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 每页记录数
     * @return 订单列表
     */
    Result<Page<Order>> listUserOrders(Long userId, Integer pageNum, Integer pageSize);
    
    /**
     * 按状态查询用户订单列表
     * @param userId 用户ID
     * @param status 状态
     * @param pageNum 页码
     * @param pageSize 每页记录数
     * @return 订单列表
     */
    Result<Page<Order>> listUserOrdersByStatus(Long userId, Integer status, Integer pageNum, Integer pageSize);
    
    /**
     * 取消订单
     * @param userId 用户ID
     * @param orderNo 订单编号
     * @return 取消结果
     */
    Result<Void> cancelOrder(Long userId, String orderNo);
    
    /**
     * 支付订单
     * @param userId 用户ID
     * @param orderNo 订单编号
     * @return 支付结果
     */
    Result<Void> payOrder(Long userId, String orderNo);
    
    /**
     * 管理员查询所有订单
     * @param pageNum 页码
     * @param pageSize 每页记录数
     * @return 订单列表
     */
    Result<Page<Order>> listAllOrders(Integer pageNum, Integer pageSize);
    
    /**
     * 管理员按状态查询所有订单
     * @param status 订单状态
     * @param pageNum 页码
     * @param pageSize 每页记录数
     * @return 订单列表
     */
    Result<Page<Order>> listAllOrdersByStatus(Integer status, Integer pageNum, Integer pageSize);
    
    /**
     * 管理员搜索订单
     * @param keyword 关键词（订单号）
     * @param status 状态（可为null）
     * @param pageNum 页码
     * @param pageSize 每页记录数
     * @return 订单列表
     */
    Result<Page<Order>> searchOrders(String keyword, Integer status, Integer pageNum, Integer pageSize);
    
    /**
     * 管理员发货
     * @param orderNo 订单编号
     * @return 发货结果
     */
    Result<Void> shipOrder(String orderNo);
    
    /**
     * 确认收货
     * @param userId 用户ID
     * @param orderNo 订单编号
     * @return 确认结果
     */
    Result<Void> confirmOrder(Long userId, String orderNo);
    
    /**
     * 查询订单数量统计
     * @return 订单数量统计
     */
    Result<Integer[]> getOrderStats();
    
    /**
     * 获取统计数据
     */
    Map<String, Object> getStatisticsData(String startDate, String endDate);
    
    /**
     * 获取用户最近的订单
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 最近的订单列表
     */
    List<Order> getRecentOrders(Long userId, int limit);
    
    /**
     * 获取用户所有订单
     * @param userId 用户ID
     * @return 用户的所有订单
     */
    List<Order> getUserOrders(Long userId);
    
    /**
     * 从商品直接创建订单
     * @param userId 用户ID
     * @param productId 商品ID
     * @param quantity 数量
     * @return 创建结果
     */
    Result<Order> createOrderFromProduct(Long userId, Long productId, Integer quantity);
} 